package myjdbc;

import java.io.*;
import java.sql.*;

/**
 * @Auther: cty
 * @Date: 2020/1/21 16:02
 * @Description:  测试BLOB类型存取
 * BLOB Binary Large Object 字符大对象
 * 用于存储大量的二进制数据，大字段的操作以流的方式来处理，只能用setBlob()来设置参数
 * MySQL中的相关类型：
 *      * TINYBLOB  最大长度为255(2^[8]–1)字符的BLOB列。
 *      * BLOB[(M)]  最大长度为65,535(2^[16]–1)字符的BLOB列。
 *      * MEDIUMBLOB  最大长度为16,777,215(2^[24]–1)字符的BLOB列。
 *      * LONGBLOB  最大长度为4,294,967,295或4GB(2^[32]–1)字符的BLOB列。
 *
 * @version: 1.0
 */
public class JDBC_Demo08_BLOB {

    public static final String URL = "jdbc:mysql://localhost:3306/testjdbc";
    public static final String USER = "root";
    public static final String PWD = "123456";

    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        InputStream is = null;
        OutputStream os = null;

        try {
            //1 加载驱动程序
            Class.forName("com.mysql.jdbc.Driver");
            //2 获取数据库连接
            conn = DriverManager.getConnection(URL,USER,PWD);
            //3 操作数据库
            //（1）存入BLOB类型数据
            String sql = "insert into user (username,infoBlob) values (?,?)";
            ps = conn.prepareStatement(sql);
            ps.setObject(1,"cty");
            ps.setBlob(2,new FileInputStream("src/jdbc.png"));  //注意不能用setObject()!
            ps.executeUpdate();
            System.out.println("存入一条包含BLOB类型数据的记录！");

            //（2）读取BLOB类型数据1
            sql = "select * from user";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();

            //4 处理返回数据
            while(rs.next()){
                //读取BLOB类型数据2
                Blob b = rs.getBlob("infoBlob");
                if(b!=null){
                    is = b.getBinaryStream();
                    os = new FileOutputStream("src/Blob.png");
                    byte[] flush = new byte[1024];
                    int len = 0;
                    while((len=is.read(flush))!=-1){
                        os.write(flush,0,len);
                        os.flush();
                    }
                    System.out.println("读取一条包含BLOB类型数据的记录！");
                }
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //5 关闭连接
            try {
                if(os!=null){
                    os.close();
                }
                if(is!=null){
                    is.close();
                }
                if(rs!=null){
                    rs.close();
                }
                if(ps!=null){
                    ps.close();
                }
                if(conn!=null){
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

/* res:
存入一条包含BLOB类型数据的记录！
读取一条包含BLOB类型数据的记录！
*/
